package Reflect;

import domain.Person;

import java.lang.reflect.Field;

/**
 * @Author: ylc
 * @Description:    反射，注解
 * @Date Created in 2022-04-19 10:59
 */
public class ReflectDemo1 {
    public static void main(String[] args) throws Exception {
        //获取person的class对象
        Class personCls = Person.class;

        /*获取成员变量们
			* Field[] getFields() ：获取所有public修饰的成员变量
			* Field getField(String name)   获取指定名称的 public修饰的成员变量

			* Field[] getDeclaredFields()  获取所有的成员变量，不考虑修饰符
			* Field getDeclaredField(String name)
         */

        //1.Field[] getFields() ：获取所有public修饰的成员变量
        Field[] fields = personCls.getFields();
        for (Field field:
             fields) {
            System.out.println(field);
        }

        System.out.println("-----------------");

        //2.Field getField(String name)  获取指定名称的 public修饰的成员变量,throw NoSuchFieldException
        Field b = personCls.getField("b");
        //获取成员变量b的值
        Person p = new Person();
        Object value = b.get(p);
        System.out.println(value);
        //设置b的值
        b.set(p, "张三");
        System.out.println(p);

        System.out.println("-------------------");
        //3.Field getDeclaredField(String name) 获取指定的成员变量，不考虑修饰符
        Field a = personCls.getDeclaredField("a");
        //忽略权限修饰符安全检查
        a.setAccessible(true);//暴力反射
        a.set(p,"ylc");
        Object value1 = a.get(p);
        System.out.println(p);
        System.out.println(value1);
    }
}
